import { defineStore } from "pinia"

export default defineStore("userStore", {
	state: () => {
		return {
			// userInfo包括 avatarUrl,nickName
			userInfo: JSON.parse(uni.getStorageSync("userInfo") || `{}`),
			// 登录所有的token值
			token: uni.getStorageSync("token") || "",
			// 收货人的地址 addres中包括userName,telNumber,postalCode,nationalCode, provinceName,cityName,countyName,detailInfo
			addres: JSON.parse(uni.getStorageSync("addres") || "{}"),
			// 重定向的(用在当用户从购物车页面跳转到登录页面，登录后重新回到购物车页面)
			redirect: {
				url: "",
				jumpType: ""
			},
		}
	},
	getters: {
		addresInfo(state) {
			let { provinceName = "", cityName = "", countyName = "", detailInfo = "" } = state.addres
			return provinceName + cityName + countyName + detailInfo
		}
	},
	actions: {
		// 封装更改数据的方法，当传入一个对象时，存在多个键值对，可以批量更改，并保存到内存中，
		// 只要有一个出错了，统一返回fasle
		// 传入的参数应该是一个对象信息，既key,value
		// 修改Stores并且保存到内存中
		changStoreStorage(obj: Object) {
			this.$patch((state: Object) => {
				for (let key in obj) {
					if (!(key in state)) {
						console.error(`state 中不存在 ${key} 属性，修改失败`)
						continue
					}
					let value = obj[key]
					let data = value
					// 如果传入的内容是，对象类型，则需要转为字符串进行保存
					if (typeof value == "object") data = JSON.stringify(data)
					uni.setStorage({
						key, data,
						success() {
							console.log(`${key} 属性，修改成功`)
							state[key] = value
						},
						fail(err: unknown) {
							console.error(`${key} 属性，修改成功`, err)
						}
					})
				}
			})
		},
		// 修改Stores但不保存到内存中的
		changStores(obj: Object) {
			this.$patch((state: Object) => {
				for (let key in obj) {
					if (!(key in state)) {
						console.error(`state 中不存在 ${key} 属性，修改失败`)
						continue
					}
					state[key] = obj[key]
				}
			})
		},
	}
})